
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Python: package remuco</title>
</head><body bgcolor="#f0f0f8">

<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="heading">
<tr bgcolor="#7799ee">
<td valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial">&nbsp;<br><big><big><strong>remuco</strong></big></big> (version 0.9.6)</font></td
><td align=right valign=bottom
><font color="#ffffff" face="helvetica, arial"></font></td></tr></table>
    <p><tt>Remuco&nbsp;player&nbsp;adapter&nbsp;module.<br>
&nbsp;<br>
The&nbsp;module&nbsp;'remuco'&nbsp;provides&nbsp;classes&nbsp;and&nbsp;constants&nbsp;for&nbsp;Remuco&nbsp;player&nbsp;adapters.<br>
&nbsp;<br>
Class&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;class&nbsp;for&nbsp;player&nbsp;adapters&nbsp;(start&nbsp;reading&nbsp;here).<br>
&nbsp;<br>
Class&nbsp;<a href="#MPRISAdapter">MPRISAdapter</a>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;Base&nbsp;class&nbsp;for&nbsp;player&nbsp;adapters&nbsp;for&nbsp;MPRIS&nbsp;players.<br>
&nbsp;<br>
Classes&nbsp;<a href="#ItemAction">ItemAction</a>&nbsp;and&nbsp;<a href="#ListAction">ListAction</a>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;Classes&nbsp;to&nbsp;define&nbsp;actions&nbsp;clients&nbsp;may&nbsp;execute&nbsp;in&nbsp;their&nbsp;media&nbsp;browser.&nbsp;<br>
&nbsp;<br>
Class&nbsp;<a href="#ListReply">ListReply</a>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;Used&nbsp;by&nbsp;player&nbsp;adapters&nbsp;to&nbsp;reply&nbsp;requests&nbsp;for&nbsp;playlists&nbsp;and&nbsp;other&nbsp;lists.<br>
&nbsp;<br>
Class&nbsp;<a href="#Manager">Manager</a>:<br>
&nbsp;&nbsp;&nbsp;&nbsp;Helper&nbsp;class&nbsp;for&nbsp;managing&nbsp;the&nbsp;life&nbsp;cycle&nbsp;of&nbsp;a&nbsp;player&nbsp;adapter.<br>
&nbsp;<br>
Constants:<br>
&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;constants&nbsp;starting&nbsp;with&nbsp;'INFO'&nbsp;are&nbsp;keys&nbsp;to&nbsp;be&nbsp;used&nbsp;for&nbsp;the&nbsp;dictionary<br>
&nbsp;&nbsp;&nbsp;&nbsp;describing&nbsp;an&nbsp;item&nbsp;(a&nbsp;playable&nbsp;<a href="api.html#object">object</a>:&nbsp;song,&nbsp;video,&nbsp;slide,&nbsp;picture,&nbsp;...).<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;constants&nbsp;starting&nbsp;with&nbsp;'PLAYBACK'&nbsp;are&nbsp;the&nbsp;values&nbsp;used&nbsp;by&nbsp;Remuco&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;describe&nbsp;a&nbsp;playback&nbsp;state.<br>
&nbsp;<br>
Logging:<br>
&nbsp;&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;recommended&nbsp;to&nbsp;use&nbsp;the&nbsp;remuco&nbsp;logging&nbsp;system&nbsp;within&nbsp;player&nbsp;adapters.<br>
&nbsp;&nbsp;&nbsp;&nbsp;To&nbsp;do&nbsp;so,&nbsp;import&nbsp;the&nbsp;module&nbsp;'remuco.log'&nbsp;and&nbsp;use&nbsp;the&nbsp;functions<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;remuco.log.debug(),<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;remuco.log.info(),<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;remuco.log.warning()&nbsp;and<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;remuco.log.error().<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;Then&nbsp;all&nbsp;messages&nbsp;of&nbsp;the&nbsp;player&nbsp;adapter&nbsp;will&nbsp;be&nbsp;written&nbsp;into&nbsp;the&nbsp;same&nbsp;file<br>
&nbsp;&nbsp;&nbsp;&nbsp;as&nbsp;used&nbsp;internally&nbsp;by&nbsp;the&nbsp;remuco&nbsp;module&nbsp;-&nbsp;that&nbsp;makes&nbsp;debugging&nbsp;a&nbsp;lot&nbsp;easier.<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;Internally&nbsp;Remuco&nbsp;uses&nbsp;the&nbsp;module&nbsp;'logging'&nbsp;for&nbsp;all&nbsp;its&nbsp;logging&nbsp;messages.<br>
&nbsp;&nbsp;&nbsp;&nbsp;Messages&nbsp;go&nbsp;into&nbsp;a&nbsp;player&nbsp;specific&nbsp;log&nbsp;file&nbsp;(usually<br>
&nbsp;&nbsp;&nbsp;&nbsp;~/.cache/remuco/PLAYER/log).&nbsp;The&nbsp;log&nbsp;level&nbsp;is&nbsp;defined&nbsp;in&nbsp;a&nbsp;player&nbsp;specific<br>
&nbsp;&nbsp;&nbsp;&nbsp;configuration&nbsp;file&nbsp;(usually&nbsp;~/.config/remuco/PLAYER/conf).</tt></p>
<p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#aa55cc">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Package Contents</strong></big></font></td></tr>
    
<tr><td bgcolor="#aa55cc"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><table width="100%" summary="list"><tr><td width="25%" valign=top><a href="api.html">adapter</a><br>
<a href="api.html">art</a><br>
<a href="api.html">config</a><br>
<a href="api.html">data</a><br>
<a href="api.html">defs</a><br>
</td><td width="25%" valign=top><a href="api.html">dictool</a><br>
<a href="api.html">features</a><br>
<a href="api.html">files</a><br>
<a href="api.html">log</a><br>
<a href="api.html">manager</a><br>
</td><td width="25%" valign=top><a href="api.html">message</a><br>
<a href="api.html">mpris</a><br>
<a href="api.html">net</a><br>
<a href="api.html">remos</a><br>
<a href="api.html">report</a><br>
</td><td width="25%" valign=top><a href="api.html">serial</a><br>
<a href="api.html">testshell</a><br>
</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ee77aa">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Classes</strong></big></font></td></tr>
    
<tr><td bgcolor="#ee77aa"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl>
<dt><font face="helvetica, arial"><a href="api.html#object">__builtin__.object</a>
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="api.html#ItemAction">remuco.adapter.ItemAction</a>
</font></dt><dt><font face="helvetica, arial"><a href="api.html#ListAction">remuco.adapter.ListAction</a>
</font></dt><dt><font face="helvetica, arial"><a href="api.html#ListReply">remuco.adapter.ListReply</a>
</font></dt><dt><font face="helvetica, arial"><a href="api.html#PlayerAdapter">remuco.adapter.PlayerAdapter</a>
</font></dt><dd>
<dl>
<dt><font face="helvetica, arial"><a href="api.html#MPRISAdapter">remuco.mpris.MPRISAdapter</a>
</font></dt></dl>
</dd>
<dt><font face="helvetica, arial"><a href="api.html#Config">remuco.config.Config</a>
</font></dt><dt><font face="helvetica, arial"><a href="api.html#Manager">remuco.manager.Manager</a>
</font></dt></dl>
</dd>
</dl>
 <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="Config">class <strong>Config</strong></a>(<a href="api.html#object">__builtin__.object</a>)</font></td></tr>
    
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>Class&nbsp;for&nbsp;getting&nbsp;and&nbsp;setting&nbsp;player&nbsp;adapter&nbsp;specific&nbsp;configurations.<br>
&nbsp;<br>
An&nbsp;instance&nbsp;of&nbsp;<a href="#Config">Config</a>&nbsp;mirrors&nbsp;the&nbsp;configuration&nbsp;of&nbsp;a&nbsp;specific&nbsp;player<br>
adapter&nbsp;(usually&nbsp;~/.config/remuco/PLAYER/conf).<br>
&nbsp;<br>
Player&nbsp;adapters&nbsp;are&nbsp;not&nbsp;supposed&nbsp;to&nbsp;create&nbsp;instances&nbsp;of&nbsp;<a href="#Config">Config</a>.&nbsp;Instead<br>
use&nbsp;the&nbsp;'config'&nbsp;attribute&nbsp;of&nbsp;a&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>&nbsp;instance&nbsp;to&nbsp;access&nbsp;the<br>
currently&nbsp;used&nbsp;<a href="#Config">Config</a>&nbsp;instance.<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="Config-__getattribute__"><strong>__getattribute__</strong></a>(self, attr)</dt><dd><tt>Attribute-style&nbsp;access&nbsp;to&nbsp;standard&nbsp;options.</tt></dd></dl>

<dl><dt><a name="Config-__init__"><strong>__init__</strong></a>(self, player_name)</dt><dd><tt>Create&nbsp;a&nbsp;new&nbsp;instance&nbsp;for&nbsp;the&nbsp;given&nbsp;player&nbsp;(adapter).</tt></dd></dl>

<dl><dt><a name="Config-getx"><strong>getx</strong></a>(self, key, default, converter<font color="#909090">=None</font>, save<font color="#909090">=True</font>)</dt><dd><tt>Get&nbsp;the&nbsp;value&nbsp;of&nbsp;a&nbsp;non-standard,&nbsp;player&nbsp;specific&nbsp;option.<br>
&nbsp;<br>
@param&nbsp;key:<br>
&nbsp;&nbsp;&nbsp;&nbsp;config&nbsp;option&nbsp;name<br>
@param&nbsp;default:<br>
&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;value&nbsp;(as&nbsp;string!)<br>
@keyword&nbsp;converter:<br>
&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;converter&nbsp;function,&nbsp;e.g.&nbsp;`int`<br>
@keyword&nbsp;save:<br>
&nbsp;&nbsp;&nbsp;&nbsp;save&nbsp;default&nbsp;value&nbsp;in&nbsp;config&nbsp;file&nbsp;if&nbsp;not&nbsp;yet&nbsp;set<br>
@return:<br>
&nbsp;&nbsp;&nbsp;&nbsp;option&nbsp;value,&nbsp;optionally&nbsp;converted</tt></dd></dl>

<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="ItemAction">class <strong>ItemAction</strong></a>(<a href="api.html#object">__builtin__.object</a>)</font></td></tr>
    
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>Item&nbsp;related&nbsp;action&nbsp;for&nbsp;a&nbsp;client's&nbsp;media&nbsp;browser.<br>
&nbsp;<br>
An&nbsp;item&nbsp;action&nbsp;defines&nbsp;an&nbsp;action&nbsp;a&nbsp;client&nbsp;may&nbsp;apply&nbsp;to&nbsp;a&nbsp;file&nbsp;from&nbsp;the<br>
local&nbsp;file&nbsp;system,&nbsp;to&nbsp;an&nbsp;item&nbsp;from&nbsp;the&nbsp;playlist,&nbsp;to&nbsp;an&nbsp;item&nbsp;from&nbsp;the&nbsp;play<br>
queue&nbsp;or&nbsp;to&nbsp;an&nbsp;item&nbsp;from&nbsp;the&nbsp;player's&nbsp;media&nbsp;library.<br>
&nbsp;&nbsp;<br>
If&nbsp;possible,&nbsp;player&nbsp;adapters&nbsp;should&nbsp;define&nbsp;item&nbsp;actions&nbsp;and&nbsp;send&nbsp;them&nbsp;to<br>
clients&nbsp;by&nbsp;setting&nbsp;the&nbsp;keyword&nbsp;'file_actions'&nbsp;in&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.<a href="#ItemAction-__init__">__init__</a>(),<br>
via&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.reply_playlist_request(),&nbsp;via<br>
<a href="#PlayerAdapter">PlayerAdapter</a>.reply_queue_request()&nbsp;or&nbsp;via<br>
<a href="#PlayerAdapter">PlayerAdapter</a>.reply_mlib_request().&nbsp;Clients&nbsp;may&nbsp;then&nbsp;use&nbsp;these&nbsp;actions<br>
which&nbsp;results&nbsp;in&nbsp;a&nbsp;call&nbsp;to&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.action_files(),<br>
<a href="#PlayerAdapter">PlayerAdapter</a>.action_playlist_item(),&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.action_queue_item()&nbsp;or<br>
<a href="#PlayerAdapter">PlayerAdapter</a>.action_mlib_item().<br>
&nbsp;<br>
@see:&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.action_files()<br>
@see:&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.action_playlist()<br>
@see:&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.action_queue()<br>
@see:&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.action_mlib_item()<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="ItemAction-__init__"><strong>__init__</strong></a>(self, label, multiple<font color="#909090">=False</font>)</dt><dd><tt>Create&nbsp;a&nbsp;new&nbsp;action&nbsp;for&nbsp;items&nbsp;or&nbsp;files.<br>
&nbsp;<br>
@param&nbsp;label:<br>
&nbsp;&nbsp;&nbsp;&nbsp;label&nbsp;of&nbsp;the&nbsp;action&nbsp;(keep&nbsp;short,&nbsp;ideally&nbsp;this&nbsp;is&nbsp;just&nbsp;a&nbsp;single&nbsp;word<br>
&nbsp;&nbsp;&nbsp;&nbsp;like&nbsp;'Enqueue',&nbsp;'Play',&nbsp;..)<br>
@keyword&nbsp;multiple:<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;the&nbsp;action&nbsp;may&nbsp;be&nbsp;applied&nbsp;to&nbsp;multiple&nbsp;items/files&nbsp;or&nbsp;only&nbsp;to&nbsp;a<br>
&nbsp;&nbsp;&nbsp;&nbsp;single&nbsp;item/file</tt></dd></dl>

<dl><dt><a name="ItemAction-__str__"><strong>__str__</strong></a>(self)</dt></dl>

<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>id</strong></dt>
<dd><tt>ID&nbsp;of&nbsp;the&nbsp;action&nbsp;(auto-generated,&nbsp;read&nbsp;only)</tt></dd>
</dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="ListAction">class <strong>ListAction</strong></a>(<a href="api.html#object">__builtin__.object</a>)</font></td></tr>
    
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>List&nbsp;related&nbsp;action&nbsp;for&nbsp;a&nbsp;client's&nbsp;media&nbsp;browser.<br>
&nbsp;<br>
A&nbsp;list&nbsp;action&nbsp;defines&nbsp;an&nbsp;action&nbsp;a&nbsp;client&nbsp;may&nbsp;apply&nbsp;to&nbsp;a&nbsp;list&nbsp;from&nbsp;the<br>
player's&nbsp;media&nbsp;library.&nbsp;If&nbsp;possible,&nbsp;player&nbsp;adapters&nbsp;may&nbsp;define&nbsp;list<br>
actions&nbsp;and&nbsp;send&nbsp;them&nbsp;to&nbsp;clients&nbsp;via&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.replay_mlib_request()<br>
Clients&nbsp;may&nbsp;then&nbsp;use&nbsp;these&nbsp;actions&nbsp;which&nbsp;results&nbsp;in&nbsp;a&nbsp;call&nbsp;to<br>
<a href="#PlayerAdapter">PlayerAdapter</a>.action_mlib_list().<br>
&nbsp;<br>
@see:&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.action_mlib_list()<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="ListAction-__init__"><strong>__init__</strong></a>(self, label)</dt><dd><tt>Create&nbsp;a&nbsp;new&nbsp;action&nbsp;for&nbsp;lists&nbsp;from&nbsp;a&nbsp;player's&nbsp;media&nbsp;library.<br>
&nbsp;<br>
@param&nbsp;label:<br>
&nbsp;&nbsp;&nbsp;&nbsp;label&nbsp;of&nbsp;the&nbsp;action&nbsp;(keep&nbsp;short,&nbsp;ideally&nbsp;this&nbsp;is&nbsp;just&nbsp;a&nbsp;single&nbsp;word<br>
&nbsp;&nbsp;&nbsp;&nbsp;like&nbsp;'Load',&nbsp;..)</tt></dd></dl>

<dl><dt><a name="ListAction-__str__"><strong>__str__</strong></a>(self)</dt></dl>

<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>id</strong></dt>
<dd><tt>ID&nbsp;of&nbsp;the&nbsp;action&nbsp;(auto-generated,&nbsp;read&nbsp;only)</tt></dd>
</dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="ListReply">class <strong>ListReply</strong></a>(<a href="api.html#object">__builtin__.object</a>)</font></td></tr>
    
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>Reply&nbsp;<a href="api.html#object">object</a>&nbsp;for&nbsp;an&nbsp;item&nbsp;list&nbsp;request.<br>
&nbsp;<br>
A&nbsp;<a href="#ListReply">ListReply</a>&nbsp;is&nbsp;the&nbsp;first&nbsp;parameter&nbsp;of&nbsp;the&nbsp;request&nbsp;methods<br>
<a href="#PlayerAdapter">PlayerAdapter</a>.request_playlist(),&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.request_queue(),<br>
<a href="#PlayerAdapter">PlayerAdapter</a>.request_mlib()&nbsp;and&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.request_search().<br>
&nbsp;<br>
Player&nbsp;adapters&nbsp;are&nbsp;supposed&nbsp;to&nbsp;use&nbsp;the&nbsp;list&nbsp;reply&nbsp;<a href="api.html#object">object</a>&nbsp;to&nbsp;set&nbsp;the<br>
reply&nbsp;data&nbsp;(using&nbsp;properties&nbsp;'ids',&nbsp;'names',&nbsp;'item_actions'&nbsp;and<br>
'nested',&nbsp;'list_actions')&nbsp;and&nbsp;to&nbsp;send&nbsp;the&nbsp;reply&nbsp;to&nbsp;clients&nbsp;(using&nbsp;<a href="#ListReply-send">send</a>()).<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="ListReply-__init__"><strong>__init__</strong></a>(self, client, request_id, reply_msg_id, page, path<font color="#909090">=None</font>)</dt><dd><tt>Create&nbsp;a&nbsp;new&nbsp;list&nbsp;reply.<br>
&nbsp;<br>
Used&nbsp;internally,&nbsp;not&nbsp;needed&nbsp;within&nbsp;player&nbsp;adapters.<br>
&nbsp;<br>
@param&nbsp;client:&nbsp;the&nbsp;client&nbsp;to&nbsp;send&nbsp;the&nbsp;reply&nbsp;to<br>
@param&nbsp;request_id:&nbsp;the&nbsp;request's&nbsp;ID<br>
@param&nbsp;reply_msg_id:&nbsp;the&nbsp;message&nbsp;ID&nbsp;of&nbsp;the&nbsp;client's&nbsp;request<br>
@param&nbsp;page:&nbsp;page&nbsp;of&nbsp;the&nbsp;requested&nbsp;list<br>
&nbsp;<br>
@keyword&nbsp;path:&nbsp;path&nbsp;of&nbsp;the&nbsp;requested&nbsp;list,&nbsp;if&nbsp;there&nbsp;is&nbsp;one</tt></dd></dl>

<dl><dt><a name="ListReply-send"><strong>send</strong></a>(self)</dt><dd><tt>Send&nbsp;the&nbsp;requested&nbsp;item&nbsp;list&nbsp;to&nbsp;the&nbsp;requesting&nbsp;client.</tt></dd></dl>

<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>ids</strong></dt>
<dd><tt>IDs&nbsp;of&nbsp;the&nbsp;items&nbsp;contained&nbsp;in&nbsp;a&nbsp;list.<br>
&nbsp;<br>
Player&nbsp;adapters&nbsp;should&nbsp;set&nbsp;this&nbsp;to&nbsp;a&nbsp;list&nbsp;of&nbsp;IDs&nbsp;of&nbsp;the&nbsp;items&nbsp;contained<br>
in&nbsp;the&nbsp;requested&nbsp;list.</tt></dd>
</dl>
<dl><dt><strong>item_actions</strong></dt>
<dd><tt>A&nbsp;list&nbsp;of&nbsp;actions&nbsp;clients&nbsp;can&nbsp;apply&nbsp;to&nbsp;items&nbsp;in&nbsp;the&nbsp;list.<br>
&nbsp;<br>
The&nbsp;list&nbsp;must&nbsp;contain&nbsp;ItemAction&nbsp;objects.</tt></dd>
</dl>
<dl><dt><strong>list_actions</strong></dt>
<dd><tt>A&nbsp;list&nbsp;of&nbsp;actions&nbsp;clients&nbsp;can&nbsp;apply&nbsp;to&nbsp;nested&nbsp;lists&nbsp;in&nbsp;the&nbsp;list.<br>
&nbsp;<br>
The&nbsp;list&nbsp;must&nbsp;contain&nbsp;ListAction&nbsp;objects.</tt></dd>
</dl>
<dl><dt><strong>names</strong></dt>
<dd><tt>Names&nbsp;of&nbsp;the&nbsp;items&nbsp;contained&nbsp;in&nbsp;a&nbsp;list.<br>
&nbsp;<br>
Player&nbsp;adapters&nbsp;should&nbsp;set&nbsp;this&nbsp;to&nbsp;a&nbsp;list&nbsp;of&nbsp;names&nbsp;of&nbsp;the&nbsp;items<br>
contained&nbsp;in&nbsp;the&nbsp;requested&nbsp;list.&nbsp;Good&nbsp;choice&nbsp;for&nbsp;a&nbsp;name&nbsp;is&nbsp;combination<br>
of&nbsp;artist&nbsp;and&nbsp;title.</tt></dd>
</dl>
<dl><dt><strong>nested</strong></dt>
<dd><tt>Names&nbsp;of&nbsp;nested&nbsp;lists&nbsp;contained&nbsp;in&nbsp;a&nbsp;list.<br>
&nbsp;<br>
Player&nbsp;adapters&nbsp;should&nbsp;set&nbsp;this&nbsp;to&nbsp;a&nbsp;list&nbsp;of&nbsp;names&nbsp;of&nbsp;the&nbsp;nested&nbsp;lists<br>
contained&nbsp;in&nbsp;the&nbsp;requested&nbsp;list.&nbsp;To&nbsp;be&nbsp;used&nbsp;only&nbsp;for&nbsp;mlib&nbsp;requests&nbsp;(see<br>
PlayerAdapter.request_mlib()).</tt></dd>
</dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="MPRISAdapter">class <strong>MPRISAdapter</strong></a>(<a href="api.html#PlayerAdapter">remuco.adapter.PlayerAdapter</a>)</font></td></tr>
    
<tr><td bgcolor="#ffc8d8"><tt>&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><dl><dt>Method resolution order:</dt>
<dd><a href="api.html#MPRISAdapter">MPRISAdapter</a></dd>
<dd><a href="api.html#PlayerAdapter">remuco.adapter.PlayerAdapter</a></dd>
<dd><a href="api.html#object">__builtin__.object</a></dd>
</dl>
<hr>
Methods defined here:<br>
<dl><dt><a name="MPRISAdapter-__init__"><strong>__init__</strong></a>(self, name, display_name<font color="#909090">=None</font>, poll<font color="#909090">=2.5</font>, mime_types<font color="#909090">=None</font>, rating<font color="#909090">=False</font>, extra_file_actions<font color="#909090">=None</font>, extra_playlist_actions<font color="#909090">=None</font>)</dt></dl>

<dl><dt><a name="MPRISAdapter-action_files"><strong>action_files</strong></a>(self, action_id, files, uris)</dt></dl>

<dl><dt><a name="MPRISAdapter-action_playlist_item"><strong>action_playlist_item</strong></a>(self, action_id, positions, ids)</dt></dl>

<dl><dt><a name="MPRISAdapter-ctrl_next"><strong>ctrl_next</strong></a>(self)</dt></dl>

<dl><dt><a name="MPRISAdapter-ctrl_previous"><strong>ctrl_previous</strong></a>(self)</dt></dl>

<dl><dt><a name="MPRISAdapter-ctrl_seek"><strong>ctrl_seek</strong></a>(self, direction)</dt></dl>

<dl><dt><a name="MPRISAdapter-ctrl_toggle_playing"><strong>ctrl_toggle_playing</strong></a>(self)</dt></dl>

<dl><dt><a name="MPRISAdapter-ctrl_toggle_repeat"><strong>ctrl_toggle_repeat</strong></a>(self)</dt></dl>

<dl><dt><a name="MPRISAdapter-ctrl_toggle_shuffle"><strong>ctrl_toggle_shuffle</strong></a>(self)</dt></dl>

<dl><dt><a name="MPRISAdapter-ctrl_volume"><strong>ctrl_volume</strong></a>(self, direction)</dt></dl>

<dl><dt><a name="MPRISAdapter-poll"><strong>poll</strong></a>(self)</dt></dl>

<dl><dt><a name="MPRISAdapter-request_playlist"><strong>request_playlist</strong></a>(self, reply)</dt></dl>

<dl><dt><a name="MPRISAdapter-start"><strong>start</strong></a>(self)</dt></dl>

<dl><dt><a name="MPRISAdapter-stop"><strong>stop</strong></a>(self)</dt></dl>

<hr>
Methods inherited from <a href="api.html#PlayerAdapter">remuco.adapter.PlayerAdapter</a>:<br>
<dl><dt><a name="MPRISAdapter-action_mlib_item"><strong>action_mlib_item</strong></a>(self, action_id, path, positions, ids)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;items&nbsp;from&nbsp;the&nbsp;player's&nbsp;media&nbsp;library.<br>
&nbsp;<br>
The&nbsp;items&nbsp;are&nbsp;specified&nbsp;redundantly&nbsp;by&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;-&nbsp;use<br>
whatever&nbsp;fits&nbsp;better.&nbsp;If&nbsp;the&nbsp;specified&nbsp;action&nbsp;is&nbsp;not&nbsp;applicable&nbsp;to<br>
multiple&nbsp;items,&nbsp;then&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;are&nbsp;one&nbsp;element&nbsp;lists.&nbsp;<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_mlib_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'item_actions'<br>
@param&nbsp;path:<br>
&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;library&nbsp;path&nbsp;that&nbsp;contains&nbsp;the&nbsp;items<br>
@param&nbsp;positions:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;positions&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to&nbsp;<br>
@param&nbsp;ids:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;IDs&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;item&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_mlib_request().</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-action_mlib_list"><strong>action_mlib_list</strong></a>(self, action_id, path)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;a&nbsp;list&nbsp;from&nbsp;the&nbsp;player's&nbsp;media&nbsp;library.<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_mlib_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'list_actions'<br>
@param&nbsp;path:<br>
&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;specifying&nbsp;the&nbsp;list&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;list&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_mlib_request().</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-action_queue_item"><strong>action_queue_item</strong></a>(self, action_id, positions, ids)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;items&nbsp;from&nbsp;the&nbsp;play&nbsp;queue.<br>
&nbsp;<br>
The&nbsp;items&nbsp;are&nbsp;specified&nbsp;redundantly&nbsp;by&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;-&nbsp;use<br>
whatever&nbsp;fits&nbsp;better.&nbsp;If&nbsp;the&nbsp;specified&nbsp;action&nbsp;is&nbsp;not&nbsp;applicable&nbsp;to<br>
multiple&nbsp;items,&nbsp;then&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;are&nbsp;one&nbsp;element&nbsp;lists.&nbsp;<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_queue_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'item_actions'<br>
@param&nbsp;positions:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;positions&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to&nbsp;<br>
@param&nbsp;ids:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;IDs&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;item&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_queue_request().</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-action_search_item"><strong>action_search_item</strong></a>(self, action_id, positions, ids)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;items&nbsp;from&nbsp;a&nbsp;search&nbsp;result.<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_search_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'item_actions'<br>
@param&nbsp;positions:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;positions&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to&nbsp;<br>
@param&nbsp;ids:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;IDs&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;list&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_search_request().</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-ctrl_navigate"><strong>ctrl_navigate</strong></a>(self, action)</dt><dd><tt>Navigate&nbsp;through&nbsp;menus&nbsp;(typically&nbsp;DVD&nbsp;menus).<br>
&nbsp;<br>
@param&nbsp;action:<br>
&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;number&nbsp;selecting&nbsp;one&nbsp;of&nbsp;these&nbsp;actions:&nbsp;UP,&nbsp;DOWN,&nbsp;LEFT,&nbsp;RIGHT,<br>
&nbsp;&nbsp;&nbsp;&nbsp;SELECT,&nbsp;RETURN,&nbsp;TOPMENU&nbsp;(e.g.&nbsp;0&nbsp;is&nbsp;UP&nbsp;and&nbsp;6&nbsp;is&nbsp;TOPMENU).<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-ctrl_rate"><strong>ctrl_rate</strong></a>(self, rating)</dt><dd><tt>Rate&nbsp;the&nbsp;currently&nbsp;played&nbsp;item.&nbsp;<br>
&nbsp;<br>
@param&nbsp;rating:<br>
&nbsp;&nbsp;&nbsp;&nbsp;rating&nbsp;value&nbsp;(int)<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-ctrl_tag"><strong>ctrl_tag</strong></a>(self, id, tags)</dt><dd><tt>Attach&nbsp;some&nbsp;tags&nbsp;to&nbsp;an&nbsp;item.<br>
&nbsp;<br>
@param&nbsp;id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;item&nbsp;to&nbsp;attach&nbsp;the&nbsp;tags&nbsp;to<br>
@param&nbsp;tags:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;list&nbsp;of&nbsp;tags<br>
&nbsp;<br>
@note:&nbsp;Tags&nbsp;does&nbsp;not&nbsp;mean&nbsp;ID3&nbsp;tags&nbsp;or&nbsp;similar.&nbsp;It&nbsp;means&nbsp;the&nbsp;general<br>
&nbsp;&nbsp;&nbsp;&nbsp;idea&nbsp;of&nbsp;tags&nbsp;(e.g.&nbsp;like&nbsp;used&nbsp;at&nbsp;last.fm).&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-ctrl_toggle_fullscreen"><strong>ctrl_toggle_fullscreen</strong></a>(self)</dt><dd><tt>Toggle&nbsp;full&nbsp;screen&nbsp;mode.&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-find_image"><strong>find_image</strong></a>(self, resource)</dt><dd><tt>Find&nbsp;a&nbsp;local&nbsp;art&nbsp;image&nbsp;file&nbsp;related&nbsp;to&nbsp;a&nbsp;resource.<br>
&nbsp;<br>
This&nbsp;method&nbsp;first&nbsp;looks&nbsp;in&nbsp;the&nbsp;resource'&nbsp;folder&nbsp;for&nbsp;typical&nbsp;art&nbsp;image<br>
files&nbsp;(e.g.&nbsp;'cover.png',&nbsp;'front.jpg',&nbsp;...).&nbsp;If&nbsp;there&nbsp;is&nbsp;no&nbsp;such&nbsp;file&nbsp;it<br>
then&nbsp;looks&nbsp;into&nbsp;the&nbsp;user's&nbsp;thumbnail&nbsp;directory&nbsp;(~/.thumbnails).<br>
&nbsp;<br>
@param&nbsp;resource:<br>
&nbsp;&nbsp;&nbsp;&nbsp;resource&nbsp;to&nbsp;find&nbsp;an&nbsp;art&nbsp;image&nbsp;for&nbsp;(may&nbsp;be&nbsp;a&nbsp;file&nbsp;name&nbsp;or&nbsp;URI)<br>
@keyword&nbsp;prefer_thumbnail:<br>
&nbsp;&nbsp;&nbsp;&nbsp;True&nbsp;means&nbsp;first&nbsp;search&nbsp;in&nbsp;thumbnails,&nbsp;False&nbsp;means&nbsp;first&nbsp;search&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;resource'&nbsp;folder<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
@return:&nbsp;an&nbsp;image&nbsp;file&nbsp;name&nbsp;(which&nbsp;can&nbsp;be&nbsp;used&nbsp;for&nbsp;<a href="#MPRISAdapter-update_item">update_item</a>())&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;None&nbsp;if&nbsp;no&nbsp;image&nbsp;file&nbsp;has&nbsp;been&nbsp;found&nbsp;or&nbsp;if&nbsp;'resource'&nbsp;is&nbsp;not&nbsp;local</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-request_mlib"><strong>request_mlib</strong></a>(self, reply, path)</dt><dd><tt>Request&nbsp;the&nbsp;content&nbsp;of&nbsp;a&nbsp;playlist&nbsp;from&nbsp;the&nbsp;player's&nbsp;media&nbsp;library.<br>
&nbsp;<br>
@param&nbsp;reply:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<a href="#ListReply">ListReply</a>&nbsp;<a href="api.html#object">object</a><br>
@param&nbsp;path:&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;path&nbsp;within&nbsp;a&nbsp;player's&nbsp;media&nbsp;library<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
If&nbsp;path&nbsp;is&nbsp;an&nbsp;empty&nbsp;list,&nbsp;the&nbsp;root&nbsp;of&nbsp;the&nbsp;library&nbsp;(all&nbsp;top&nbsp;level<br>
playlists)&nbsp;are&nbsp;requested.&nbsp;Otherwise&nbsp;path&nbsp;is&nbsp;set&nbsp;as&nbsp;illustrated&nbsp;in&nbsp;this<br>
example:<br>
&nbsp;<br>
Consider&nbsp;a&nbsp;player&nbsp;with&nbsp;a&nbsp;media&nbsp;library&nbsp;structure&nbsp;like&nbsp;this:<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;Radio<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;Genres<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Jazz<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;...<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;Dynamic<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Never&nbsp;played<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Played&nbsp;recently<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;...<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;Playlists<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Party<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Sue's&nbsp;b-day<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;...<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;...<br>
&nbsp;<br>
If&nbsp;path&nbsp;is&nbsp;the&nbsp;empty&nbsp;list,&nbsp;all&nbsp;top&nbsp;level&nbsp;playlists&nbsp;are&nbsp;requests,&nbsp;e.g.<br>
['Radio',&nbsp;'Genres',&nbsp;'Dynamic',&nbsp;'Playlists',&nbsp;...].&nbsp;Otherwise&nbsp;path&nbsp;may<br>
specify&nbsp;a&nbsp;specific&nbsp;level&nbsp;in&nbsp;the&nbsp;library&nbsp;tree,&nbsp;e.g.&nbsp;[&nbsp;'Radio'&nbsp;]&nbsp;or<br>
[&nbsp;'Playlists',&nbsp;'Party',&nbsp;'Sue's&nbsp;b-day'&nbsp;]&nbsp;or&nbsp;etc.<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-request_queue"><strong>request_queue</strong></a>(self, reply)</dt><dd><tt>Request&nbsp;the&nbsp;content&nbsp;of&nbsp;the&nbsp;play&nbsp;queue.<br>
&nbsp;<br>
@param&nbsp;reply:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<a href="#ListReply">ListReply</a>&nbsp;<a href="api.html#object">object</a><br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-request_search"><strong>request_search</strong></a>(self, reply, query)</dt><dd><tt>Request&nbsp;a&nbsp;list&nbsp;of&nbsp;items&nbsp;matching&nbsp;a&nbsp;search&nbsp;query.<br>
&nbsp;<br>
@param&nbsp;reply:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<a href="#ListReply">ListReply</a>&nbsp;<a href="api.html#object">object</a><br>
@param&nbsp;query:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;list&nbsp;of&nbsp;search&nbsp;query&nbsp;values&nbsp;corresponding&nbsp;with&nbsp;the&nbsp;search&nbsp;mask<br>
&nbsp;&nbsp;&nbsp;&nbsp;specified&nbsp;with&nbsp;keyword&nbsp;'search_mask'&nbsp;in&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.<a href="#MPRISAdapter-__init__">__init__</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
Example:&nbsp;If&nbsp;search&nbsp;mask&nbsp;was&nbsp;[&nbsp;'Artist',&nbsp;'Title',&nbsp;'Album'&nbsp;],&nbsp;then<br>
a&nbsp;query&nbsp;may&nbsp;look&nbsp;like&nbsp;this:&nbsp;[&nbsp;'Blondie',&nbsp;'',&nbsp;'Best'&nbsp;].&nbsp;It&nbsp;is&nbsp;up&nbsp;to<br>
player&nbsp;adapters&nbsp;how&nbsp;to&nbsp;interpret&nbsp;these&nbsp;values.&nbsp;However,&nbsp;good&nbsp;practice<br>
is&nbsp;to&nbsp;interpret&nbsp;them&nbsp;as&nbsp;case&nbsp;insensitive,&nbsp;and-connected,&nbsp;non&nbsp;exact<br>
matching&nbsp;search&nbsp;values.&nbsp;The&nbsp;given&nbsp;example&nbsp;would&nbsp;then&nbsp;reply&nbsp;a&nbsp;list<br>
with&nbsp;all&nbsp;items&nbsp;where&nbsp;'Blondie'&nbsp;is&nbsp;contained&nbsp;in&nbsp;the&nbsp;artist&nbsp;field&nbsp;and<br>
'Best'&nbsp;is&nbsp;contained&nbsp;in&nbsp;the&nbsp;Album&nbsp;field.<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-update_item"><strong>update_item</strong></a>(self, id, info, img)</dt><dd><tt>Set&nbsp;currently&nbsp;played&nbsp;item.<br>
&nbsp;<br>
@param&nbsp;id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;ID&nbsp;(str)<br>
@param&nbsp;info:<br>
&nbsp;&nbsp;&nbsp;&nbsp;meta&nbsp;information&nbsp;(dict)<br>
@param&nbsp;img:<br>
&nbsp;&nbsp;&nbsp;&nbsp;image&nbsp;/&nbsp;cover&nbsp;art&nbsp;(either&nbsp;a&nbsp;file&nbsp;name&nbsp;or&nbsp;URI&nbsp;or&nbsp;an&nbsp;instance&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;Image.Image)<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.<br>
&nbsp;<br>
@see:&nbsp;<a href="#MPRISAdapter-find_image">find_image</a>()&nbsp;for&nbsp;finding&nbsp;image&nbsp;files&nbsp;for&nbsp;an&nbsp;item.<br>
&nbsp;<br>
@see:&nbsp;remuco.INFO_...&nbsp;for&nbsp;keys&nbsp;to&nbsp;use&nbsp;for&nbsp;'info'</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-update_playback"><strong>update_playback</strong></a>(self, playback)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;playback&nbsp;state.<br>
&nbsp;<br>
@param&nbsp;playback:<br>
&nbsp;&nbsp;&nbsp;&nbsp;playback&nbsp;mode<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
@see:&nbsp;remuco.PLAYBACK_...<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-update_position"><strong>update_position</strong></a>(self, position, queue<font color="#909090">=False</font>)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;item's&nbsp;position&nbsp;in&nbsp;the&nbsp;playlist&nbsp;or&nbsp;queue.&nbsp;<br>
&nbsp;<br>
@param&nbsp;position:<br>
&nbsp;&nbsp;&nbsp;&nbsp;position&nbsp;of&nbsp;the&nbsp;currently&nbsp;played&nbsp;item&nbsp;(starting&nbsp;at&nbsp;0)<br>
@keyword&nbsp;queue:<br>
&nbsp;&nbsp;&nbsp;&nbsp;True&nbsp;if&nbsp;currently&nbsp;played&nbsp;item&nbsp;is&nbsp;from&nbsp;the&nbsp;queue,&nbsp;False&nbsp;if&nbsp;it&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;the&nbsp;currently&nbsp;active&nbsp;playlist<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-update_progress"><strong>update_progress</strong></a>(self, progress, length)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;playback&nbsp;progress.<br>
&nbsp;<br>
@param&nbsp;progress:<br>
&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;of&nbsp;currently&nbsp;elapsed&nbsp;seconds<br>
@keyword&nbsp;length:<br>
&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;length&nbsp;in&nbsp;seconds&nbsp;(maximum&nbsp;possible&nbsp;progress&nbsp;value)<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-update_repeat"><strong>update_repeat</strong></a>(self, repeat)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;repeat&nbsp;mode.&nbsp;<br>
&nbsp;<br>
@param&nbsp;repeat:&nbsp;True&nbsp;means&nbsp;play&nbsp;indefinitely,&nbsp;False&nbsp;means&nbsp;stop&nbsp;after&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;playlist&nbsp;item<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-update_shuffle"><strong>update_shuffle</strong></a>(self, shuffle)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;shuffle&nbsp;mode.&nbsp;<br>
&nbsp;<br>
@param&nbsp;shuffle:&nbsp;True&nbsp;means&nbsp;play&nbsp;in&nbsp;non-linear&nbsp;order,&nbsp;False&nbsp;means&nbsp;play<br>
&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;linear&nbsp;order<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="MPRISAdapter-update_volume"><strong>update_volume</strong></a>(self, volume)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;volume.<br>
&nbsp;<br>
@param&nbsp;volume:&nbsp;the&nbsp;volume&nbsp;in&nbsp;percent<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<hr>
Data descriptors inherited from <a href="api.html#PlayerAdapter">remuco.adapter.PlayerAdapter</a>:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<hr>
Data and other attributes inherited from <a href="api.html#PlayerAdapter">remuco.adapter.PlayerAdapter</a>:<br>
<dl><dt><strong>manager</strong> = &lt;remuco.manager.NoManager object&gt;</dl>

</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="Manager">class <strong>Manager</strong></a>(<a href="api.html#object">__builtin__.object</a>)</font></td></tr>
    
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>Life&nbsp;cycle&nbsp;manager&nbsp;for&nbsp;a&nbsp;stand-alone&nbsp;player&nbsp;adapter.<br>
&nbsp;<br>
A&nbsp;manager&nbsp;cares&nbsp;about&nbsp;calling&nbsp;a&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>'s&nbsp;start&nbsp;and&nbsp;stop&nbsp;methods.<br>
Additionally,&nbsp;because&nbsp;Remuco&nbsp;needs&nbsp;a&nbsp;GLib&nbsp;main&nbsp;loop&nbsp;to&nbsp;run,&nbsp;it&nbsp;sets&nbsp;up&nbsp;and<br>
manages&nbsp;such&nbsp;a&nbsp;loop.<br>
&nbsp;<br>
It&nbsp;is&nbsp;intended&nbsp;for&nbsp;player&nbsp;adapters&nbsp;running&nbsp;stand-alone,&nbsp;outside&nbsp;the&nbsp;players<br>
they&nbsp;adapt.&nbsp;A&nbsp;manager&nbsp;is&nbsp;not&nbsp;needed&nbsp;for&nbsp;player&nbsp;adapters&nbsp;realized&nbsp;as&nbsp;a<br>
plugin&nbsp;for&nbsp;a&nbsp;media&nbsp;player.&nbsp;In&nbsp;that&nbsp;case&nbsp;the&nbsp;player's&nbsp;plugin&nbsp;interface<br>
should&nbsp;care&nbsp;about&nbsp;the&nbsp;life&nbsp;cycle&nbsp;of&nbsp;a&nbsp;player&nbsp;adapter&nbsp;(see&nbsp;the&nbsp;Rhythmbox<br>
player&nbsp;adapter&nbsp;as&nbsp;an&nbsp;example).<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="Manager-__init__"><strong>__init__</strong></a>(self, pa, dbus_name<font color="#909090">=None</font>, poll_fn<font color="#909090">=None</font>)</dt><dd><tt>Create&nbsp;a&nbsp;new&nbsp;manager.<br>
&nbsp;<br>
@param&nbsp;pa:<br>
&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>&nbsp;to&nbsp;manage<br>
@keyword&nbsp;dbus_name:<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;the&nbsp;player&nbsp;adapter&nbsp;uses&nbsp;DBus&nbsp;to&nbsp;communicate&nbsp;with&nbsp;its&nbsp;player&nbsp;set<br>
&nbsp;&nbsp;&nbsp;&nbsp;this&nbsp;to&nbsp;the&nbsp;player's&nbsp;well&nbsp;known&nbsp;bus&nbsp;name&nbsp;(see&nbsp;<a href="#Manager-run">run</a>()&nbsp;for&nbsp;more<br>
&nbsp;&nbsp;&nbsp;&nbsp;information)<br>
@keyword&nbsp;poll_fn:<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;DBus&nbsp;is&nbsp;not&nbsp;used,&nbsp;this&nbsp;function&nbsp;may&nbsp;be&nbsp;set&nbsp;for&nbsp;periodic&nbsp;checks<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;the&nbsp;player&nbsp;is&nbsp;running,&nbsp;used&nbsp;to&nbsp;automatically&nbsp;start&nbsp;and&nbsp;stop&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;player&nbsp;adapter<br>
&nbsp;<br>
When&nbsp;neither&nbsp;`dbus_name`&nbsp;nor&nbsp;`poll_fn`&nbsp;is&nbsp;given,&nbsp;the&nbsp;adapter&nbsp;is&nbsp;started<br>
immediately,&nbsp;assuming&nbsp;the&nbsp;player&nbsp;is&nbsp;running&nbsp;and&nbsp;the&nbsp;adapter&nbsp;is&nbsp;ready&nbsp;to<br>
work.</tt></dd></dl>

<dl><dt><a name="Manager-run"><strong>run</strong></a>(self)</dt><dd><tt>Activate&nbsp;the&nbsp;manager.<br>
&nbsp;<br>
This&nbsp;method&nbsp;starts&nbsp;the&nbsp;player&nbsp;adapter,&nbsp;runs&nbsp;a&nbsp;main&nbsp;loop&nbsp;(GLib)&nbsp;and<br>
blocks&nbsp;until&nbsp;SIGINT&nbsp;or&nbsp;SIGTERM&nbsp;arrives&nbsp;or&nbsp;until&nbsp;<a href="#Manager-stop">stop</a>()&nbsp;gets&nbsp;called.&nbsp;If<br>
this&nbsp;happens&nbsp;the&nbsp;player&nbsp;adapter&nbsp;gets&nbsp;stopped&nbsp;and&nbsp;this&nbsp;method&nbsp;returns.<br>
&nbsp;<br>
If&nbsp;`player_dbus_name`&nbsp;or&nbsp;`poll_fn`&nbsp;has&nbsp;been&nbsp;passed&nbsp;to&nbsp;<a href="#Manager-__init__">__init__</a>(),&nbsp;then<br>
the&nbsp;player&nbsp;adapter&nbsp;does&nbsp;not&nbsp;get&nbsp;started&nbsp;until&nbsp;the&nbsp;player&nbsp;is&nbsp;running<br>
(according&nbsp;to&nbsp;checks&nbsp;based&nbsp;on&nbsp;the&nbsp;DBus&nbsp;name&nbsp;or&nbsp;poll&nbsp;function).&nbsp;Also&nbsp;the<br>
adapter&nbsp;gets&nbsp;stopped&nbsp;automatically&nbsp;if&nbsp;the&nbsp;player&nbsp;is&nbsp;not&nbsp;running<br>
anymore.&nbsp;However,&nbsp;the&nbsp;manager&nbsp;keeps&nbsp;running,&nbsp;i.e.&nbsp;the&nbsp;player&nbsp;adapter<br>
may&nbsp;get&nbsp;started&nbsp;and&nbsp;stopped&nbsp;multiple&nbsp;times&nbsp;while&nbsp;this&nbsp;method&nbsp;is<br>
running.</tt></dd></dl>

<dl><dt><a name="Manager-stop"><strong>stop</strong></a>(self)</dt><dd><tt>Shut&nbsp;down&nbsp;the&nbsp;manager.<br>
&nbsp;<br>
Stops&nbsp;the&nbsp;manager's&nbsp;main&nbsp;loop&nbsp;and&nbsp;player&nbsp;adapter.&nbsp;As&nbsp;a&nbsp;result&nbsp;a<br>
previous&nbsp;call&nbsp;to&nbsp;<a href="#Manager-run">run</a>()&nbsp;will&nbsp;return&nbsp;now.&nbsp;This&nbsp;should&nbsp;be&nbsp;used&nbsp;by&nbsp;player<br>
adapters&nbsp;when&nbsp;there&nbsp;is&nbsp;a&nbsp;crucial&nbsp;error&nbsp;and&nbsp;restarting&nbsp;the&nbsp;adapter&nbsp;won't<br>
fix&nbsp;this.</tt></dd></dl>

<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
</td></tr></table> <p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#ffc8d8">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#000000" face="helvetica, arial"><a name="PlayerAdapter">class <strong>PlayerAdapter</strong></a>(<a href="api.html#object">__builtin__.object</a>)</font></td></tr>
    
<tr bgcolor="#ffc8d8"><td rowspan=2><tt>&nbsp;&nbsp;&nbsp;</tt></td>
<td colspan=2><tt>Base&nbsp;class&nbsp;for&nbsp;Remuco&nbsp;player&nbsp;adapters.<br>
&nbsp;<br>
Remuco&nbsp;player&nbsp;adapters&nbsp;must&nbsp;subclass&nbsp;this&nbsp;class&nbsp;and&nbsp;override&nbsp;certain<br>
methods&nbsp;to&nbsp;implement&nbsp;player&nbsp;specific&nbsp;behavior.&nbsp;Additionally&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a><br>
provides&nbsp;methods&nbsp;to&nbsp;interact&nbsp;with&nbsp;Remuco&nbsp;clients.&nbsp;Following&nbsp;is&nbsp;a&nbsp;summary<br>
of&nbsp;all&nbsp;relevant&nbsp;methods,&nbsp;grouped&nbsp;by&nbsp;functionality.&nbsp;<br>
&nbsp;<br>
===========================================================================<br>
Methods&nbsp;to&nbsp;extend&nbsp;to&nbsp;manage&nbsp;life&nbsp;cycle<br>
===========================================================================<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-start">start</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-stop">stop</a>()<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>&nbsp;can&nbsp;be&nbsp;started&nbsp;and&nbsp;stopped&nbsp;with&nbsp;<a href="#PlayerAdapter-start">start</a>()&nbsp;and&nbsp;<a href="#PlayerAdapter-stop">stop</a>().<br>
&nbsp;&nbsp;&nbsp;&nbsp;The&nbsp;same&nbsp;instance&nbsp;of&nbsp;a&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>&nbsp;should&nbsp;be&nbsp;startable&nbsp;and&nbsp;stoppable<br>
&nbsp;&nbsp;&nbsp;&nbsp;multiple&nbsp;times.<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;Subclasses&nbsp;of&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>&nbsp;may&nbsp;override&nbsp;these&nbsp;methods&nbsp;as&nbsp;needed&nbsp;but<br>
&nbsp;&nbsp;&nbsp;&nbsp;must&nbsp;always&nbsp;call&nbsp;the&nbsp;super&nbsp;class&nbsp;implementations&nbsp;too!<br>
&nbsp;<br>
===========================================================================<br>
Methods&nbsp;to&nbsp;override&nbsp;to&nbsp;control&nbsp;the&nbsp;media&nbsp;player:<br>
===========================================================================<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_toggle_playing">ctrl_toggle_playing</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_toggle_repeat">ctrl_toggle_repeat</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_toggle_shuffle">ctrl_toggle_shuffle</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_toggle_fullscreen">ctrl_toggle_fullscreen</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_next">ctrl_next</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_previous">ctrl_previous</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_seek">ctrl_seek</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_volume">ctrl_volume</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_rate">ctrl_rate</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_tag">ctrl_tag</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-ctrl_navigate">ctrl_navigate</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-action_files">action_files</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-action_playlist_item">action_playlist_item</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-action_queue_item">action_queue_item</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-action_mlib_item">action_mlib_item</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-action_mlib_list">action_mlib_list</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-action_search_item">action_search_item</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;Player&nbsp;adapters&nbsp;only&nbsp;need&nbsp;to&nbsp;implement&nbsp;only&nbsp;a&nbsp;*subset*&nbsp;of&nbsp;these<br>
&nbsp;&nbsp;&nbsp;&nbsp;methods&nbsp;-&nbsp;depending&nbsp;on&nbsp;what&nbsp;is&nbsp;possible&nbsp;and&nbsp;what&nbsp;makes&nbsp;sense.<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;Remuco&nbsp;checks&nbsp;which&nbsp;methods&nbsp;have&nbsp;been&nbsp;overridden&nbsp;and&nbsp;uses&nbsp;this<br>
&nbsp;&nbsp;&nbsp;&nbsp;information&nbsp;to&nbsp;notify&nbsp;Remuco&nbsp;clients&nbsp;about&nbsp;capabilities&nbsp;of&nbsp;player<br>
&nbsp;&nbsp;&nbsp;&nbsp;adapters.&nbsp;<br>
&nbsp;<br>
===========================================================================<br>
Methods&nbsp;to&nbsp;override&nbsp;to&nbsp;provide&nbsp;information&nbsp;from&nbsp;the&nbsp;media&nbsp;player:<br>
===========================================================================<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-request_playlist">request_playlist</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-request_queue">request_queue</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-request_mlib">request_mlib</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-request_search">request_search</a>()<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;As&nbsp;above,&nbsp;only&nbsp;override&nbsp;the&nbsp;methods&nbsp;which&nbsp;make&nbsp;sense&nbsp;for&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;corresponding&nbsp;media&nbsp;player.<br>
&nbsp;<br>
===========================================================================<br>
Methods&nbsp;to&nbsp;call&nbsp;to&nbsp;synchronize&nbsp;media&nbsp;player&nbsp;state&nbsp;information&nbsp;with&nbsp;clients:<br>
===========================================================================<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-update_playback">update_playback</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-update_repeat">update_repeat</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-update_shuffle">update_shuffle</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-update_item">update_item</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-update_position">update_position</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-update_progress">update_progress</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;These&nbsp;methods&nbsp;should&nbsp;be&nbsp;called&nbsp;whenever&nbsp;the&nbsp;corresponding&nbsp;information<br>
&nbsp;&nbsp;&nbsp;&nbsp;has&nbsp;changed&nbsp;in&nbsp;the&nbsp;media&nbsp;player&nbsp;(it&nbsp;is&nbsp;safe&nbsp;to&nbsp;call&nbsp;these&nbsp;methods&nbsp;also<br>
&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;there&nbsp;actually&nbsp;is&nbsp;no&nbsp;change,&nbsp;internally&nbsp;a&nbsp;change&nbsp;check&nbsp;is&nbsp;done<br>
&nbsp;&nbsp;&nbsp;&nbsp;before&nbsp;sending&nbsp;any&nbsp;data&nbsp;to&nbsp;clients).<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;Subclasses&nbsp;of&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>&nbsp;may&nbsp;override&nbsp;the&nbsp;method&nbsp;<a href="#PlayerAdapter-poll">poll</a>()&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;periodically&nbsp;check&nbsp;a&nbsp;player's&nbsp;state.<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
===========================================================================<br>
Finally&nbsp;some&nbsp;utility&nbsp;methods:<br>
===========================================================================<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<a href="#PlayerAdapter-find_image">find_image</a>()<br>&nbsp;</tt></td></tr>
<tr><td>&nbsp;</td>
<td width="100%">Methods defined here:<br>
<dl><dt><a name="PlayerAdapter-__init__"><strong>__init__</strong></a>(self, name, playback_known<font color="#909090">=False</font>, volume_known<font color="#909090">=False</font>, repeat_known<font color="#909090">=False</font>, shuffle_known<font color="#909090">=False</font>, progress_known<font color="#909090">=False</font>, max_rating<font color="#909090">=0</font>, poll<font color="#909090">=2.5</font>, file_actions<font color="#909090">=None</font>, mime_types<font color="#909090">=None</font>, search_mask<font color="#909090">=None</font>)</dt><dd><tt>Create&nbsp;a&nbsp;new&nbsp;player&nbsp;adapter&nbsp;and&nbsp;configure&nbsp;its&nbsp;capabilities.<br>
&nbsp;<br>
Just&nbsp;does&nbsp;some&nbsp;early&nbsp;initializations.&nbsp;Real&nbsp;job&nbsp;starts&nbsp;with&nbsp;<a href="#PlayerAdapter-start">start</a>().<br>
&nbsp;<br>
@param&nbsp;name:<br>
&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;of&nbsp;the&nbsp;media&nbsp;player<br>
@keyword&nbsp;playback_known:<br>
&nbsp;&nbsp;&nbsp;&nbsp;indicates&nbsp;if&nbsp;the&nbsp;player's&nbsp;playback&nbsp;state&nbsp;can&nbsp;be&nbsp;provided&nbsp;(see<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#PlayerAdapter-update_playback">update_playback</a>())<br>
@keyword&nbsp;volume_known:<br>
&nbsp;&nbsp;&nbsp;&nbsp;indicates&nbsp;if&nbsp;the&nbsp;player's&nbsp;volume&nbsp;can&nbsp;be&nbsp;provided&nbsp;(see<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#PlayerAdapter-update_volume">update_volume</a>())<br>
@keyword&nbsp;repeat_known:<br>
&nbsp;&nbsp;&nbsp;&nbsp;indicates&nbsp;if&nbsp;the&nbsp;player's&nbsp;repeat&nbsp;mode&nbsp;can&nbsp;be&nbsp;provided&nbsp;(see<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#PlayerAdapter-update_repeat">update_repeat</a>())<br>
@keyword&nbsp;shuffle_known:<br>
&nbsp;&nbsp;&nbsp;&nbsp;indicates&nbsp;if&nbsp;the&nbsp;player's&nbsp;shuffle&nbsp;mode&nbsp;can&nbsp;be&nbsp;provided&nbsp;(see<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#PlayerAdapter-update_shuffle">update_shuffle</a>())<br>
@keyword&nbsp;progress_known:<br>
&nbsp;&nbsp;&nbsp;&nbsp;indicates&nbsp;if&nbsp;the&nbsp;player's&nbsp;playback&nbsp;progress&nbsp;can&nbsp;be&nbsp;provided&nbsp;(see<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#PlayerAdapter-update_progress">update_progress</a>())<br>
@keyword&nbsp;max_rating:<br>
&nbsp;&nbsp;&nbsp;&nbsp;maximum&nbsp;possible&nbsp;rating&nbsp;value&nbsp;for&nbsp;items<br>
@keyword&nbsp;poll:<br>
&nbsp;&nbsp;&nbsp;&nbsp;interval&nbsp;in&nbsp;seconds&nbsp;to&nbsp;call&nbsp;<a href="#PlayerAdapter-poll">poll</a>()<br>
@keyword&nbsp;file_actions:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;<a href="#ItemAction">ItemAction</a>&nbsp;which&nbsp;can&nbsp;be&nbsp;applied&nbsp;to&nbsp;files&nbsp;from&nbsp;the&nbsp;local<br>
&nbsp;&nbsp;&nbsp;&nbsp;file&nbsp;system&nbsp;(actions&nbsp;like&nbsp;play&nbsp;a&nbsp;file&nbsp;or&nbsp;append&nbsp;files&nbsp;to&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;playlist)&nbsp;-&nbsp;this&nbsp;keyword&nbsp;is&nbsp;only&nbsp;relevant&nbsp;if&nbsp;the&nbsp;method<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#PlayerAdapter-action_files">action_files</a>()&nbsp;gets&nbsp;overridden<br>
@keyword&nbsp;mime_types:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;mime&nbsp;types&nbsp;specifying&nbsp;the&nbsp;files&nbsp;to&nbsp;which&nbsp;the&nbsp;actions&nbsp;given<br>
&nbsp;&nbsp;&nbsp;&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'file_actions'&nbsp;can&nbsp;be&nbsp;applied,&nbsp;this&nbsp;may&nbsp;be&nbsp;general<br>
&nbsp;&nbsp;&nbsp;&nbsp;types&nbsp;like&nbsp;'audio'&nbsp;or&nbsp;'video'&nbsp;but&nbsp;also&nbsp;specific&nbsp;types&nbsp;like<br>
&nbsp;&nbsp;&nbsp;&nbsp;'audio/mp3'&nbsp;or&nbsp;'video/quicktime'&nbsp;(setting&nbsp;this&nbsp;to&nbsp;None&nbsp;means&nbsp;all<br>
&nbsp;&nbsp;&nbsp;&nbsp;mime&nbsp;types&nbsp;are&nbsp;supported)&nbsp;-&nbsp;this&nbsp;keyword&nbsp;is&nbsp;only&nbsp;relevant&nbsp;if&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;method&nbsp;<a href="#PlayerAdapter-action_files">action_files</a>()&nbsp;gets&nbsp;overridden<br>
@keyword&nbsp;search_mask:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;fields&nbsp;to&nbsp;search&nbsp;the&nbsp;players&nbsp;library&nbsp;for&nbsp;(e.g.&nbsp;artist,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;genre,&nbsp;any,&nbsp;...)&nbsp;-&nbsp;if&nbsp;set&nbsp;method&nbsp;<a href="#PlayerAdapter-request_search">request_search</a>()&nbsp;should&nbsp;be<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overridden<br>
&nbsp;<br>
@attention:&nbsp;When&nbsp;overriding,&nbsp;call&nbsp;super&nbsp;class&nbsp;implementation&nbsp;first!</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-action_files"><strong>action_files</strong></a>(self, action_id, files, uris)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;files.<br>
&nbsp;<br>
The&nbsp;files&nbsp;are&nbsp;specified&nbsp;redundantly&nbsp;by&nbsp;'files'&nbsp;and&nbsp;'uris'&nbsp;-&nbsp;use<br>
whatever&nbsp;fits&nbsp;better.&nbsp;If&nbsp;the&nbsp;specified&nbsp;action&nbsp;is&nbsp;not&nbsp;applicable&nbsp;to<br>
multiple&nbsp;files,&nbsp;then&nbsp;'files'&nbsp;and&nbsp;'uris'&nbsp;are&nbsp;one&nbsp;element&nbsp;lists.<br>
&nbsp;<br>
The&nbsp;files&nbsp;in&nbsp;'files'&nbsp;and&nbsp;'uris'&nbsp;may&nbsp;be&nbsp;any&nbsp;files&nbsp;from&nbsp;the&nbsp;local&nbsp;file<br>
system&nbsp;that&nbsp;have&nbsp;one&nbsp;of&nbsp;the&nbsp;mime&nbsp;types&nbsp;specified&nbsp;by&nbsp;the&nbsp;keyword<br>
'mime_types'&nbsp;in&nbsp;<a href="#PlayerAdapter-__init__">__init__</a>().<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;<a href="#PlayerAdapter-__init__">__init__</a>()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'file_actions'<br>
@param&nbsp;files:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;files&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to&nbsp;(regular&nbsp;path&nbsp;names)&nbsp;<br>
@param&nbsp;uris:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;files&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to&nbsp;(URI&nbsp;notation)&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;file&nbsp;item&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;<a href="#PlayerAdapter-__init__">__init__</a>().</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-action_mlib_item"><strong>action_mlib_item</strong></a>(self, action_id, path, positions, ids)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;items&nbsp;from&nbsp;the&nbsp;player's&nbsp;media&nbsp;library.<br>
&nbsp;<br>
The&nbsp;items&nbsp;are&nbsp;specified&nbsp;redundantly&nbsp;by&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;-&nbsp;use<br>
whatever&nbsp;fits&nbsp;better.&nbsp;If&nbsp;the&nbsp;specified&nbsp;action&nbsp;is&nbsp;not&nbsp;applicable&nbsp;to<br>
multiple&nbsp;items,&nbsp;then&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;are&nbsp;one&nbsp;element&nbsp;lists.&nbsp;<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_mlib_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'item_actions'<br>
@param&nbsp;path:<br>
&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;library&nbsp;path&nbsp;that&nbsp;contains&nbsp;the&nbsp;items<br>
@param&nbsp;positions:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;positions&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to&nbsp;<br>
@param&nbsp;ids:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;IDs&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;item&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_mlib_request().</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-action_mlib_list"><strong>action_mlib_list</strong></a>(self, action_id, path)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;a&nbsp;list&nbsp;from&nbsp;the&nbsp;player's&nbsp;media&nbsp;library.<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_mlib_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'list_actions'<br>
@param&nbsp;path:<br>
&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;specifying&nbsp;the&nbsp;list&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;list&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_mlib_request().</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-action_playlist_item"><strong>action_playlist_item</strong></a>(self, action_id, positions, ids)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;items&nbsp;from&nbsp;the&nbsp;playlist.<br>
&nbsp;<br>
The&nbsp;items&nbsp;are&nbsp;specified&nbsp;redundantly&nbsp;by&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;-&nbsp;use<br>
whatever&nbsp;fits&nbsp;better.&nbsp;If&nbsp;the&nbsp;specified&nbsp;action&nbsp;is&nbsp;not&nbsp;applicable&nbsp;to<br>
multiple&nbsp;items,&nbsp;then&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;are&nbsp;one&nbsp;element&nbsp;lists.&nbsp;<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_playlist_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'item_actions'<br>
@param&nbsp;positions:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;positions&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
@param&nbsp;ids:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;IDs&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;item&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_playlist_request().</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-action_queue_item"><strong>action_queue_item</strong></a>(self, action_id, positions, ids)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;items&nbsp;from&nbsp;the&nbsp;play&nbsp;queue.<br>
&nbsp;<br>
The&nbsp;items&nbsp;are&nbsp;specified&nbsp;redundantly&nbsp;by&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;-&nbsp;use<br>
whatever&nbsp;fits&nbsp;better.&nbsp;If&nbsp;the&nbsp;specified&nbsp;action&nbsp;is&nbsp;not&nbsp;applicable&nbsp;to<br>
multiple&nbsp;items,&nbsp;then&nbsp;'positions'&nbsp;and&nbsp;'ids'&nbsp;are&nbsp;one&nbsp;element&nbsp;lists.&nbsp;<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_queue_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'item_actions'<br>
@param&nbsp;positions:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;positions&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to&nbsp;<br>
@param&nbsp;ids:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;IDs&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;item&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_queue_request().</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-action_search_item"><strong>action_search_item</strong></a>(self, action_id, positions, ids)</dt><dd><tt>Do&nbsp;an&nbsp;action&nbsp;on&nbsp;one&nbsp;or&nbsp;more&nbsp;items&nbsp;from&nbsp;a&nbsp;search&nbsp;result.<br>
&nbsp;<br>
@param&nbsp;action_id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;action&nbsp;to&nbsp;do&nbsp;-&nbsp;this&nbsp;specifies&nbsp;one&nbsp;of&nbsp;the&nbsp;actions&nbsp;passed<br>
&nbsp;&nbsp;&nbsp;&nbsp;previously&nbsp;to&nbsp;reply_search_request()&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'item_actions'<br>
@param&nbsp;positions:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;positions&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to&nbsp;<br>
@param&nbsp;ids:<br>
&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;of&nbsp;IDs&nbsp;to&nbsp;apply&nbsp;the&nbsp;action&nbsp;to<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;list&nbsp;actions&nbsp;gets&nbsp;passed&nbsp;to&nbsp;reply_search_request().</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_navigate"><strong>ctrl_navigate</strong></a>(self, action)</dt><dd><tt>Navigate&nbsp;through&nbsp;menus&nbsp;(typically&nbsp;DVD&nbsp;menus).<br>
&nbsp;<br>
@param&nbsp;action:<br>
&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;number&nbsp;selecting&nbsp;one&nbsp;of&nbsp;these&nbsp;actions:&nbsp;UP,&nbsp;DOWN,&nbsp;LEFT,&nbsp;RIGHT,<br>
&nbsp;&nbsp;&nbsp;&nbsp;SELECT,&nbsp;RETURN,&nbsp;TOPMENU&nbsp;(e.g.&nbsp;0&nbsp;is&nbsp;UP&nbsp;and&nbsp;6&nbsp;is&nbsp;TOPMENU).<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_next"><strong>ctrl_next</strong></a>(self)</dt><dd><tt>Play&nbsp;the&nbsp;next&nbsp;item.&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_previous"><strong>ctrl_previous</strong></a>(self)</dt><dd><tt>Play&nbsp;the&nbsp;previous&nbsp;item.&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_rate"><strong>ctrl_rate</strong></a>(self, rating)</dt><dd><tt>Rate&nbsp;the&nbsp;currently&nbsp;played&nbsp;item.&nbsp;<br>
&nbsp;<br>
@param&nbsp;rating:<br>
&nbsp;&nbsp;&nbsp;&nbsp;rating&nbsp;value&nbsp;(int)<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_seek"><strong>ctrl_seek</strong></a>(self, direction)</dt><dd><tt>Seek&nbsp;forward&nbsp;or&nbsp;backward&nbsp;some&nbsp;seconds.&nbsp;<br>
&nbsp;<br>
The&nbsp;number&nbsp;of&nbsp;seconds&nbsp;to&nbsp;seek&nbsp;should&nbsp;be&nbsp;reasonable&nbsp;for&nbsp;the&nbsp;current<br>
item's&nbsp;length&nbsp;(if&nbsp;known).<br>
&nbsp;<br>
If&nbsp;the&nbsp;progress&nbsp;of&nbsp;the&nbsp;current&nbsp;item&nbsp;is&nbsp;known,&nbsp;it&nbsp;should&nbsp;get<br>
synchronized&nbsp;immediately&nbsp;with&nbsp;clients&nbsp;by&nbsp;calling&nbsp;<a href="#PlayerAdapter-update_progress">update_progress</a>().<br>
&nbsp;<br>
@param&nbsp;direction:<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;-1:&nbsp;seek&nbsp;backward&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;+1:&nbsp;seek&nbsp;forward<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_tag"><strong>ctrl_tag</strong></a>(self, id, tags)</dt><dd><tt>Attach&nbsp;some&nbsp;tags&nbsp;to&nbsp;an&nbsp;item.<br>
&nbsp;<br>
@param&nbsp;id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;ID&nbsp;of&nbsp;the&nbsp;item&nbsp;to&nbsp;attach&nbsp;the&nbsp;tags&nbsp;to<br>
@param&nbsp;tags:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;list&nbsp;of&nbsp;tags<br>
&nbsp;<br>
@note:&nbsp;Tags&nbsp;does&nbsp;not&nbsp;mean&nbsp;ID3&nbsp;tags&nbsp;or&nbsp;similar.&nbsp;It&nbsp;means&nbsp;the&nbsp;general<br>
&nbsp;&nbsp;&nbsp;&nbsp;idea&nbsp;of&nbsp;tags&nbsp;(e.g.&nbsp;like&nbsp;used&nbsp;at&nbsp;last.fm).&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_toggle_fullscreen"><strong>ctrl_toggle_fullscreen</strong></a>(self)</dt><dd><tt>Toggle&nbsp;full&nbsp;screen&nbsp;mode.&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_toggle_playing"><strong>ctrl_toggle_playing</strong></a>(self)</dt><dd><tt>Toggle&nbsp;play&nbsp;and&nbsp;pause.&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_toggle_repeat"><strong>ctrl_toggle_repeat</strong></a>(self)</dt><dd><tt>Toggle&nbsp;repeat&nbsp;mode.&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.<br>
&nbsp;<br>
@see:&nbsp;<a href="#PlayerAdapter-update_repeat">update_repeat</a>()</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_toggle_shuffle"><strong>ctrl_toggle_shuffle</strong></a>(self)</dt><dd><tt>Toggle&nbsp;shuffle&nbsp;mode.&nbsp;<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.<br>
&nbsp;<br>
@see:&nbsp;<a href="#PlayerAdapter-update_shuffle">update_shuffle</a>()</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-ctrl_volume"><strong>ctrl_volume</strong></a>(self, direction)</dt><dd><tt>Adjust&nbsp;volume.&nbsp;<br>
&nbsp;<br>
@param&nbsp;volume:<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;-1:&nbsp;decrease&nbsp;by&nbsp;some&nbsp;percent&nbsp;(5&nbsp;is&nbsp;a&nbsp;good&nbsp;value)<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;0:&nbsp;mute&nbsp;volume<br>
&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;+1:&nbsp;increase&nbsp;by&nbsp;some&nbsp;percent&nbsp;(5&nbsp;is&nbsp;a&nbsp;good&nbsp;value)<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-find_image"><strong>find_image</strong></a>(self, resource)</dt><dd><tt>Find&nbsp;a&nbsp;local&nbsp;art&nbsp;image&nbsp;file&nbsp;related&nbsp;to&nbsp;a&nbsp;resource.<br>
&nbsp;<br>
This&nbsp;method&nbsp;first&nbsp;looks&nbsp;in&nbsp;the&nbsp;resource'&nbsp;folder&nbsp;for&nbsp;typical&nbsp;art&nbsp;image<br>
files&nbsp;(e.g.&nbsp;'cover.png',&nbsp;'front.jpg',&nbsp;...).&nbsp;If&nbsp;there&nbsp;is&nbsp;no&nbsp;such&nbsp;file&nbsp;it<br>
then&nbsp;looks&nbsp;into&nbsp;the&nbsp;user's&nbsp;thumbnail&nbsp;directory&nbsp;(~/.thumbnails).<br>
&nbsp;<br>
@param&nbsp;resource:<br>
&nbsp;&nbsp;&nbsp;&nbsp;resource&nbsp;to&nbsp;find&nbsp;an&nbsp;art&nbsp;image&nbsp;for&nbsp;(may&nbsp;be&nbsp;a&nbsp;file&nbsp;name&nbsp;or&nbsp;URI)<br>
@keyword&nbsp;prefer_thumbnail:<br>
&nbsp;&nbsp;&nbsp;&nbsp;True&nbsp;means&nbsp;first&nbsp;search&nbsp;in&nbsp;thumbnails,&nbsp;False&nbsp;means&nbsp;first&nbsp;search&nbsp;in<br>
&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;resource'&nbsp;folder<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
@return:&nbsp;an&nbsp;image&nbsp;file&nbsp;name&nbsp;(which&nbsp;can&nbsp;be&nbsp;used&nbsp;for&nbsp;<a href="#PlayerAdapter-update_item">update_item</a>())&nbsp;or<br>
&nbsp;&nbsp;&nbsp;&nbsp;None&nbsp;if&nbsp;no&nbsp;image&nbsp;file&nbsp;has&nbsp;been&nbsp;found&nbsp;or&nbsp;if&nbsp;'resource'&nbsp;is&nbsp;not&nbsp;local</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-poll"><strong>poll</strong></a>(self)</dt><dd><tt>Does&nbsp;nothing&nbsp;by&nbsp;default.<br>
&nbsp;<br>
If&nbsp;player&nbsp;adapters&nbsp;override&nbsp;this&nbsp;method,&nbsp;it&nbsp;gets&nbsp;called&nbsp;periodically<br>
in&nbsp;the&nbsp;interval&nbsp;specified&nbsp;by&nbsp;the&nbsp;keyword&nbsp;'poll'&nbsp;in&nbsp;<a href="#PlayerAdapter-__init__">__init__</a>().<br>
&nbsp;<br>
A&nbsp;typical&nbsp;use&nbsp;case&nbsp;of&nbsp;this&nbsp;method&nbsp;is&nbsp;to&nbsp;detect&nbsp;the&nbsp;playback&nbsp;progress&nbsp;of<br>
the&nbsp;current&nbsp;item&nbsp;and&nbsp;then&nbsp;call&nbsp;<a href="#PlayerAdapter-update_progress">update_progress</a>().&nbsp;It&nbsp;can&nbsp;also&nbsp;be&nbsp;used<br>
to&nbsp;poll&nbsp;any&nbsp;other&nbsp;player&nbsp;state&nbsp;information&nbsp;when&nbsp;a&nbsp;player&nbsp;does&nbsp;not<br>
provide&nbsp;signals&nbsp;for&nbsp;all&nbsp;or&nbsp;certain&nbsp;state&nbsp;information&nbsp;changes.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-request_mlib"><strong>request_mlib</strong></a>(self, reply, path)</dt><dd><tt>Request&nbsp;the&nbsp;content&nbsp;of&nbsp;a&nbsp;playlist&nbsp;from&nbsp;the&nbsp;player's&nbsp;media&nbsp;library.<br>
&nbsp;<br>
@param&nbsp;reply:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<a href="#ListReply">ListReply</a>&nbsp;<a href="api.html#object">object</a><br>
@param&nbsp;path:&nbsp;<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;path&nbsp;within&nbsp;a&nbsp;player's&nbsp;media&nbsp;library<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
If&nbsp;path&nbsp;is&nbsp;an&nbsp;empty&nbsp;list,&nbsp;the&nbsp;root&nbsp;of&nbsp;the&nbsp;library&nbsp;(all&nbsp;top&nbsp;level<br>
playlists)&nbsp;are&nbsp;requested.&nbsp;Otherwise&nbsp;path&nbsp;is&nbsp;set&nbsp;as&nbsp;illustrated&nbsp;in&nbsp;this<br>
example:<br>
&nbsp;<br>
Consider&nbsp;a&nbsp;player&nbsp;with&nbsp;a&nbsp;media&nbsp;library&nbsp;structure&nbsp;like&nbsp;this:<br>
&nbsp;<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;Radio<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;Genres<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Jazz<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;...<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;Dynamic<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Never&nbsp;played<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Played&nbsp;recently<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;...<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;Playlists<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Party<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;Sue's&nbsp;b-day<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|-&nbsp;...<br>
&nbsp;&nbsp;&nbsp;|-&nbsp;...<br>
&nbsp;<br>
If&nbsp;path&nbsp;is&nbsp;the&nbsp;empty&nbsp;list,&nbsp;all&nbsp;top&nbsp;level&nbsp;playlists&nbsp;are&nbsp;requests,&nbsp;e.g.<br>
['Radio',&nbsp;'Genres',&nbsp;'Dynamic',&nbsp;'Playlists',&nbsp;...].&nbsp;Otherwise&nbsp;path&nbsp;may<br>
specify&nbsp;a&nbsp;specific&nbsp;level&nbsp;in&nbsp;the&nbsp;library&nbsp;tree,&nbsp;e.g.&nbsp;[&nbsp;'Radio'&nbsp;]&nbsp;or<br>
[&nbsp;'Playlists',&nbsp;'Party',&nbsp;'Sue's&nbsp;b-day'&nbsp;]&nbsp;or&nbsp;etc.<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-request_playlist"><strong>request_playlist</strong></a>(self, reply)</dt><dd><tt>Request&nbsp;the&nbsp;content&nbsp;of&nbsp;the&nbsp;currently&nbsp;active&nbsp;playlist.<br>
&nbsp;<br>
@param&nbsp;reply:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<a href="#ListReply">ListReply</a>&nbsp;<a href="api.html#object">object</a><br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-request_queue"><strong>request_queue</strong></a>(self, reply)</dt><dd><tt>Request&nbsp;the&nbsp;content&nbsp;of&nbsp;the&nbsp;play&nbsp;queue.<br>
&nbsp;<br>
@param&nbsp;reply:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<a href="#ListReply">ListReply</a>&nbsp;<a href="api.html#object">object</a><br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-request_search"><strong>request_search</strong></a>(self, reply, query)</dt><dd><tt>Request&nbsp;a&nbsp;list&nbsp;of&nbsp;items&nbsp;matching&nbsp;a&nbsp;search&nbsp;query.<br>
&nbsp;<br>
@param&nbsp;reply:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;<a href="#ListReply">ListReply</a>&nbsp;<a href="api.html#object">object</a><br>
@param&nbsp;query:<br>
&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;list&nbsp;of&nbsp;search&nbsp;query&nbsp;values&nbsp;corresponding&nbsp;with&nbsp;the&nbsp;search&nbsp;mask<br>
&nbsp;&nbsp;&nbsp;&nbsp;specified&nbsp;with&nbsp;keyword&nbsp;'search_mask'&nbsp;in&nbsp;<a href="#PlayerAdapter">PlayerAdapter</a>.<a href="#PlayerAdapter-__init__">__init__</a>()<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
Example:&nbsp;If&nbsp;search&nbsp;mask&nbsp;was&nbsp;[&nbsp;'Artist',&nbsp;'Title',&nbsp;'Album'&nbsp;],&nbsp;then<br>
a&nbsp;query&nbsp;may&nbsp;look&nbsp;like&nbsp;this:&nbsp;[&nbsp;'Blondie',&nbsp;'',&nbsp;'Best'&nbsp;].&nbsp;It&nbsp;is&nbsp;up&nbsp;to<br>
player&nbsp;adapters&nbsp;how&nbsp;to&nbsp;interpret&nbsp;these&nbsp;values.&nbsp;However,&nbsp;good&nbsp;practice<br>
is&nbsp;to&nbsp;interpret&nbsp;them&nbsp;as&nbsp;case&nbsp;insensitive,&nbsp;and-connected,&nbsp;non&nbsp;exact<br>
matching&nbsp;search&nbsp;values.&nbsp;The&nbsp;given&nbsp;example&nbsp;would&nbsp;then&nbsp;reply&nbsp;a&nbsp;list<br>
with&nbsp;all&nbsp;items&nbsp;where&nbsp;'Blondie'&nbsp;is&nbsp;contained&nbsp;in&nbsp;the&nbsp;artist&nbsp;field&nbsp;and<br>
'Best'&nbsp;is&nbsp;contained&nbsp;in&nbsp;the&nbsp;Album&nbsp;field.<br>
&nbsp;<br>
@note:&nbsp;Override&nbsp;if&nbsp;it&nbsp;is&nbsp;possible&nbsp;and&nbsp;makes&nbsp;sense.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-start"><strong>start</strong></a>(self)</dt><dd><tt>Start&nbsp;the&nbsp;player&nbsp;adapter.<br>
&nbsp;<br>
@attention:&nbsp;When&nbsp;overriding,&nbsp;call&nbsp;super&nbsp;class&nbsp;implementation&nbsp;first!</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-stop"><strong>stop</strong></a>(self)</dt><dd><tt>Shutdown&nbsp;the&nbsp;player&nbsp;adapter.<br>
&nbsp;<br>
Disconnects&nbsp;all&nbsp;clients&nbsp;and&nbsp;shuts&nbsp;down&nbsp;the&nbsp;Bluetooth&nbsp;and&nbsp;WiFi&nbsp;server.<br>
Also&nbsp;ignores&nbsp;any&nbsp;subsequent&nbsp;calls&nbsp;to&nbsp;an&nbsp;update&nbsp;or&nbsp;reply&nbsp;method&nbsp;(e.g.<br>
<a href="#PlayerAdapter-update_volume">update_volume</a>(),&nbsp;...,&nbsp;reply_playlist_request(),&nbsp;...).&nbsp;<br>
&nbsp;<br>
@note:&nbsp;The&nbsp;same&nbsp;player&nbsp;adapter&nbsp;instance&nbsp;can&nbsp;be&nbsp;started&nbsp;again&nbsp;with<br>
&nbsp;&nbsp;&nbsp;&nbsp;<a href="#PlayerAdapter-start">start</a>().<br>
&nbsp;<br>
@attention:&nbsp;When&nbsp;overriding,&nbsp;call&nbsp;super&nbsp;class&nbsp;implementation&nbsp;first!</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-update_item"><strong>update_item</strong></a>(self, id, info, img)</dt><dd><tt>Set&nbsp;currently&nbsp;played&nbsp;item.<br>
&nbsp;<br>
@param&nbsp;id:<br>
&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;ID&nbsp;(str)<br>
@param&nbsp;info:<br>
&nbsp;&nbsp;&nbsp;&nbsp;meta&nbsp;information&nbsp;(dict)<br>
@param&nbsp;img:<br>
&nbsp;&nbsp;&nbsp;&nbsp;image&nbsp;/&nbsp;cover&nbsp;art&nbsp;(either&nbsp;a&nbsp;file&nbsp;name&nbsp;or&nbsp;URI&nbsp;or&nbsp;an&nbsp;instance&nbsp;of<br>
&nbsp;&nbsp;&nbsp;&nbsp;Image.Image)<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.<br>
&nbsp;<br>
@see:&nbsp;<a href="#PlayerAdapter-find_image">find_image</a>()&nbsp;for&nbsp;finding&nbsp;image&nbsp;files&nbsp;for&nbsp;an&nbsp;item.<br>
&nbsp;<br>
@see:&nbsp;remuco.INFO_...&nbsp;for&nbsp;keys&nbsp;to&nbsp;use&nbsp;for&nbsp;'info'</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-update_playback"><strong>update_playback</strong></a>(self, playback)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;playback&nbsp;state.<br>
&nbsp;<br>
@param&nbsp;playback:<br>
&nbsp;&nbsp;&nbsp;&nbsp;playback&nbsp;mode<br>
&nbsp;&nbsp;&nbsp;&nbsp;<br>
@see:&nbsp;remuco.PLAYBACK_...<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-update_position"><strong>update_position</strong></a>(self, position, queue<font color="#909090">=False</font>)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;item's&nbsp;position&nbsp;in&nbsp;the&nbsp;playlist&nbsp;or&nbsp;queue.&nbsp;<br>
&nbsp;<br>
@param&nbsp;position:<br>
&nbsp;&nbsp;&nbsp;&nbsp;position&nbsp;of&nbsp;the&nbsp;currently&nbsp;played&nbsp;item&nbsp;(starting&nbsp;at&nbsp;0)<br>
@keyword&nbsp;queue:<br>
&nbsp;&nbsp;&nbsp;&nbsp;True&nbsp;if&nbsp;currently&nbsp;played&nbsp;item&nbsp;is&nbsp;from&nbsp;the&nbsp;queue,&nbsp;False&nbsp;if&nbsp;it&nbsp;is<br>
&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;the&nbsp;currently&nbsp;active&nbsp;playlist<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-update_progress"><strong>update_progress</strong></a>(self, progress, length)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;playback&nbsp;progress.<br>
&nbsp;<br>
@param&nbsp;progress:<br>
&nbsp;&nbsp;&nbsp;&nbsp;number&nbsp;of&nbsp;currently&nbsp;elapsed&nbsp;seconds<br>
@keyword&nbsp;length:<br>
&nbsp;&nbsp;&nbsp;&nbsp;item&nbsp;length&nbsp;in&nbsp;seconds&nbsp;(maximum&nbsp;possible&nbsp;progress&nbsp;value)<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-update_repeat"><strong>update_repeat</strong></a>(self, repeat)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;repeat&nbsp;mode.&nbsp;<br>
&nbsp;<br>
@param&nbsp;repeat:&nbsp;True&nbsp;means&nbsp;play&nbsp;indefinitely,&nbsp;False&nbsp;means&nbsp;stop&nbsp;after&nbsp;the<br>
&nbsp;&nbsp;&nbsp;&nbsp;last&nbsp;playlist&nbsp;item<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-update_shuffle"><strong>update_shuffle</strong></a>(self, shuffle)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;shuffle&nbsp;mode.&nbsp;<br>
&nbsp;<br>
@param&nbsp;shuffle:&nbsp;True&nbsp;means&nbsp;play&nbsp;in&nbsp;non-linear&nbsp;order,&nbsp;False&nbsp;means&nbsp;play<br>
&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;linear&nbsp;order<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<dl><dt><a name="PlayerAdapter-update_volume"><strong>update_volume</strong></a>(self, volume)</dt><dd><tt>Set&nbsp;the&nbsp;current&nbsp;volume.<br>
&nbsp;<br>
@param&nbsp;volume:&nbsp;the&nbsp;volume&nbsp;in&nbsp;percent<br>
&nbsp;<br>
@note:&nbsp;Call&nbsp;to&nbsp;synchronize&nbsp;player&nbsp;state&nbsp;with&nbsp;remote&nbsp;clients.</tt></dd></dl>

<hr>
Data descriptors defined here:<br>
<dl><dt><strong>__dict__</strong></dt>
<dd><tt>dictionary&nbsp;for&nbsp;instance&nbsp;variables&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<dl><dt><strong>__weakref__</strong></dt>
<dd><tt>list&nbsp;of&nbsp;weak&nbsp;references&nbsp;to&nbsp;the&nbsp;object&nbsp;(if&nbsp;defined)</tt></dd>
</dl>
<hr>
Data and other attributes defined here:<br>
<dl><dt><strong>manager</strong> = &lt;remuco.manager.NoManager object&gt;</dl>

</td></tr></table></td></tr></table><p>
<table width="100%" cellspacing=0 cellpadding=2 border=0 summary="section">
<tr bgcolor="#55aa55">
<td colspan=3 valign=bottom>&nbsp;<br>
<font color="#ffffff" face="helvetica, arial"><big><strong>Data</strong></big></font></td></tr>
    
<tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
<td width="100%"><strong>INFO_ALBUM</strong> = 'album'<br>
<strong>INFO_ARTIST</strong> = 'artist'<br>
<strong>INFO_GENRE</strong> = 'genre'<br>
<strong>INFO_LENGTH</strong> = 'length'<br>
<strong>INFO_RATING</strong> = 'rating'<br>
<strong>INFO_TAGS</strong> = 'tags'<br>
<strong>INFO_TITLE</strong> = 'title'<br>
<strong>INFO_YEAR</strong> = 'year'<br>
<strong>MIMETYPES_AUDIO</strong> = ('audio', 'application/ogg')<br>
<strong>MIMETYPES_AV</strong> = ('audio', 'application/ogg', 'video')<br>
<strong>MIMETYPES_VIDEO</strong> = ('video',)<br>
<strong>PLAYBACK_PAUSE</strong> = 1<br>
<strong>PLAYBACK_PLAY</strong> = 2<br>
<strong>PLAYBACK_STOP</strong> = 0<br>
<strong>__all__</strong> = ['PlayerAdapter', 'ListReply', 'MPRISAdapter', 'ItemAction', 'ListAction', 'Manager', 'Config', 'INFO_ALBUM', 'INFO_ARTIST', 'INFO_GENRE', 'INFO_LENGTH', 'INFO_RATING', 'INFO_TAGS', 'INFO_TITLE', 'INFO_YEAR', 'PLAYBACK_PAUSE', 'PLAYBACK_PLAY', 'PLAYBACK_STOP', 'MIMETYPES_AUDIO', 'MIMETYPES_VIDEO', ...]<br>
<strong>__version__</strong> = '0.9.6'</td></tr></table>
</body></html>